﻿
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;



namespace iri10
{
    class NegVentanas : ApplicationContext
    {

        //Estados posibles
        public const int eNOLOAD = 0;
        public const int eMAIN = 1;
        public const int eLOGIN = 2;
        public const int eBUSCAR_PEDIDO = 3;
        public const int eSEL_TIPO = 4;
        public const int eSEL_BASE = 5;
        public const int ePERSONALIZAR = 6;
        public const int ePEDIDO = 7;
        public const int eCOMPRADO = 8;

        //En que estado estoy
        static int Estado = eNOLOAD;

        static frmMain fMain;
        static frmLogIn fLogin;
        static frmBuscarPedido fBuscarPedido;
        static frmSeleccionarTipo fSeleccionarTipo;
        static frmSeleccionarPcBase fSeleccionarPcBase;
        static frmPersonalizar fPersonalizar;
        static frmPedido fPedido;
        public static frmComprado fComprado; //Publico porque se cierra a si mismo

        public void inicializar()
        {

           
        }

        public NegVentanas()
        {

            //Inicialice los componentes?
            if (Estado == eNOLOAD)
                inicializar();

            fMain = new frmMain();
            fMain.Closed += new EventHandler(OnFormClosed);

            // Show form.
            fMain.Show();
            Estado = eMAIN;
        }

        public static void showFinCompra()
        {
            if (fPedido != null)
                fPedido.Close();
            if (fPersonalizar != null)
                fPersonalizar.Close();
            if (fSeleccionarPcBase != null)
                fSeleccionarPcBase.Close();


            fPedido = null;
            fPersonalizar = null;
            fSeleccionarPcBase = null;


        }

        public static void showPedido()
        {

            //Distintos estados
            switch (Estado)
            {
                case ePERSONALIZAR:
                {
                    fPersonalizar.ocultar();
                    fPersonalizar.Visible = false;
                    break;
                }
                case ePEDIDO:
                {
                    //TODO: No debería pasar
                    return;
                    break;
                }
            }

            //El usuario esta logueado? --> Llamo a login
            if (usuarioActual.User == null)
                showLogIn();

            //Si sigue sin loguearse, me voy y muestro personalizar
            if (usuarioActual.User == null)
            {
                fPersonalizar.Visible = true;
                return;
            }


            //Muestro Pedido
            fPedido = new frmPedido();
            fPedido.MdiParent = fMain;
            fPedido.Show();

            Estado = ePEDIDO;


        }

        private static Form cerrarForm(Form f)
        {
            if (f != null)
                f.Close();
            return null;
        }

        private void OnFormClosed(object sender, EventArgs e)
        {
            // When a form is closed, decrement the count of open forms.

            // When the count gets to 0, exit the app by calling
            // ExitThread().
            cerrarTodo();

            Application.Exit();
        }

        public static void cerrarTodo()
        {
            cerrarForm((Form)fLogin);
            cerrarForm((Form)fBuscarPedido);
            cerrarForm((Form)fSeleccionarTipo);
            cerrarForm((Form)fSeleccionarPcBase);
            cerrarForm((Form)fPersonalizar);
            cerrarForm((Form)fPedido);
            cerrarForm((Form)fComprado);

            fLogin = null;
            fBuscarPedido = null;
            fSeleccionarTipo = null;
            fSeleccionarPcBase = null;
            fPersonalizar = null;
            fPedido = null;
            fComprado = null;

            //Volví al main
            Estado = eMAIN;

        }
        
        public static void showBuscarPedido()
        {
            DialogResult r;

            switch (Estado)
            {
                case eBUSCAR_PEDIDO:
                    return;
                    break;
                case eLOGIN:
                    MessageBox.Show("Debe autenticarse antes de buscar sus pedidos", "Autenticarse", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
                    return;
                    break;
                case eSEL_TIPO:
                case eSEL_BASE:
                case ePERSONALIZAR:
                case ePEDIDO:
                case eCOMPRADO:
                    cerrarTodo();
                    break;
                
            }

            //Esta autenticado?
            if (usuarioActual.User == null)
            {
                r = MessageBox.Show("Debe autenticarse primero para poder buscar sus pedidos\n¿Desea hacerlo ahora?", "Error", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

                if (r.CompareTo(DialogResult.Yes) == 0)
                    showLogIn();
                else
                    return;

                //Si no se pudo loguear no sigo
                if (usuarioActual.User == null)
                    return;
            }

            fBuscarPedido = new frmBuscarPedido();
            fBuscarPedido.MdiParent = fMain;
            fBuscarPedido.Show();

            //Cargo el estado
            Estado = eBUSCAR_PEDIDO;
               

        }
        
        public static void finBuscarPedido()
        {
            fBuscarPedido.Close();
            fBuscarPedido = null;
            Estado = eMAIN;
        }

        public static void showSeleccionarTipo()
        {
            //Cierro las otras ventanas
            switch (Estado)
            {
                case eLOGIN:
                {
                    fLogin.Close();
                    fLogin.Tag = "Cerrado";
                    break;
                }
                case eBUSCAR_PEDIDO:
                {
                    cerrarTodo();
                    break;
                }
                case eSEL_TIPO:
                {
                    if (fSeleccionarTipo.Visible == false)
                        fSeleccionarTipo.Show();
                    return;
                    break;
                }
                case eSEL_BASE:
                {
                    fSeleccionarPcBase.Close();
                    fSeleccionarPcBase = null;
                    break;
                }
            }

            

            if(fSeleccionarTipo == null)
                fSeleccionarTipo = new frmSeleccionarTipo();

            fSeleccionarTipo.MdiParent = fMain;
            fSeleccionarTipo.Show();
            Estado = eSEL_TIPO;
            //Porque esta se oculta... sino tiene problemas con el login
            fSeleccionarTipo.Visible = true;


        }
    
        public static void showPersonalizar()
        {
            switch (Estado)
            {
                case eSEL_BASE:
                {
                    fSeleccionarPcBase.ocultar();
                    fSeleccionarPcBase.Visible = false;
                    break;
                }
                case ePEDIDO:
                {
                    fPedido.ocultar();
                    fPedido.Close();
                    fPedido = null;
                    break;
                }
               
            }

            //Mi nuevo estado
            Estado = ePERSONALIZAR;

            //Muestro el formulario
            if( fPersonalizar == null)
                fPersonalizar = new frmPersonalizar();

            fPersonalizar.MdiParent = fMain;
            fPersonalizar.Show();
        }

        public static void showSeleccionarPcBase()
        {
            switch (Estado)
            {
                case eLOGIN:
                    break;
                case eBUSCAR_PEDIDO:
                    break;
                case eSEL_TIPO:
                    fSeleccionarTipo.Close();
                    fSeleccionarTipo = null;
                    break;
                case ePERSONALIZAR:
                    //Vengo de la ventana siguiente, solo tengo que mostrala
                    fPersonalizar.Close();
                    fPersonalizar = null;
                    fSeleccionarPcBase.Visible = true;
                    break;
            }

            Estado = eSEL_BASE;

            if(fSeleccionarPcBase == null)
                fSeleccionarPcBase = new frmSeleccionarPcBase();
            fSeleccionarPcBase.MdiParent = fMain;
            fSeleccionarPcBase.Show();

            

        }

        public static void showLogIn()
        {
            DialogResult r;
            int EstadoAnterior = Estado;


            //Esta el formulario logion arriba
            if (Estado == eLOGIN)
                return;

            //Hay alguien logueado?
            if (usuarioActual.User != null)
            {
                r = MessageBox.Show("¿Está seguro que desea abandonar el sistema?", "Login", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information);
                
                //Quiere desconectar el usuario actual y empezar con otro usuario?
                if (r.CompareTo(DialogResult.Yes) == 0)
                {
                    //Adios adios
                    usuarioActual.User = null;
                    //Cierro todas las ventanas y pongo que antes no había nada abierto
                    cerrarTodo();
                    EstadoAnterior = eMAIN;
                }
                else
                    return;
            }

            //Borro el dibujito, para indicar que ya no esta autenticado, por mas que cancele
            fMain.logIn();

            //Cierro todo lo que estaba haciendo
            if (EstadoAnterior == eBUSCAR_PEDIDO)
            {
                fBuscarPedido.Hide();
            }
            if (EstadoAnterior == eSEL_TIPO)
            {
                fSeleccionarTipo.ocultar();
                fSeleccionarTipo.Visible = false;
            }
            

            //Abro el 
            //Cambio el estado
            Estado = eLOGIN;

            //Muestro la ventana de login
            fLogin = new frmLogIn();
            fLogin.MdiParent = fMain;
            fLogin.Show();
            fLogin.BringToFront();

            //Es una especie de showDialog, entonces espero a que termine
            while (fLogin != null && fLogin.Tag != "Cerrado")
                Application.DoEvents();

            //cierro la ventana login
            fLogin = null;


            //Cambio el estado
            Estado = EstadoAnterior;
            switch (EstadoAnterior)
            {
                case eBUSCAR_PEDIDO:
                    fBuscarPedido.Show();
                    break;
                case eSEL_TIPO:
                    fSeleccionarTipo.Show();
                    break;
            }

            //Cambio de usuario
            fMain.logIn();
        }

        public static void showComprado()
        {
            //Cierra todo
            cerrarTodo();

            fComprado = new frmComprado();
            fComprado.MdiParent = fMain;
            fComprado.Show();
        }

        public static void refreshMain()
        {
            if (fMain == null)
                return;
            fMain.Refresh();
        }
    }
}
